www.gusucode.com > VC++ 百叶窗面板组特效源码-源码程序 > VC++ 百叶窗面板组特效源码-源码程序/code/CurtainBoxDlg.cpp

    //Download by http://www.NewXing.com
// CurtainBoxDlg.cpp : implementation file
//

#include "stdafx.h"
#include "CurtainBox.h"
#include "CurtainBoxDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCurtainBoxDlg dialog

CCurtainBoxDlg::CCurtainBoxDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCurtainBoxDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCurtainBoxDlg)
	m_Edit = _T("作者:风林");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCurtainBoxDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCurtainBoxDlg)
	DDX_Control(pDX, IDC_TITLE3, m_Title3);
	DDX_Control(pDX, IDC_TITLE2, m_Title2);
	DDX_Control(pDX, IDC_TITLE1, m_Title1);
	DDX_Text(pDX, IDC_CONTROL32, m_Edit);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCurtainBoxDlg, CDialog)
	//{{AFX_MSG_MAP(CCurtainBoxDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_TITLE1, OnTitle1)
	ON_BN_CLICKED(IDC_TITLE2, OnTitle2)
	ON_BN_CLICKED(IDC_TITLE3, OnTitle3)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCurtainBoxDlg message handlers

BOOL CCurtainBoxDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	InitBox();		//初始化面板组
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CCurtainBoxDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	if (IsIconic())
	{
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}

	CRect rect;
	GetClientRect(&rect);
	dc.FillSolidRect(&rect,RGB(192,248,202));	//绘制对话框背景色

	CBrush Brush;								//画边框
	Brush.CreateSolidBrush( RGB(97,120,140) );
	dc.SelectObject( &Brush );
	dc.RoundRect( m_BoxRext.left-9, m_BoxRext.top-9,
		m_BoxRext.right+9, m_BoxRext.bottom+9, 10, 10 );	//外框
	dc.FillSolidRect( m_BoxRext.left, m_BoxRext.top,
		m_BoxRext.Width(), m_BoxRext.Height(), GetSysColor( COLOR_BTNFACE ) );	//内框
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CCurtainBoxDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
/////////////////////////////////////////////////////////////////////
//初始化面板组
void CCurtainBoxDlg::InitBox()
{
	m_BoxRext.SetRect( 44, 29, 232, 247);	//面板组位置

	m_Box1ID[0] = IDC_CONTROL11;	//面板1中控件ID号
	m_Box1ID[1] = IDC_CONTROL12;
	m_Box1ID[2] = IDC_CONTROL13;
	m_Box1ID[3] = IDC_CONTROL14;

	m_Box2ID[0] = IDC_CONTROL21;	//面板2中控件ID号

	m_Box3ID[0] = IDC_CONTROL31;	//面板3中控件ID号
	m_Box3ID[1] = IDC_CONTROL32;
	m_Box3ID[2] = IDC_CONTROL33;

	b_Mark1 = true;		//面板1初态-展开
	b_Mark2 = true;		//面板2初态-展开
	b_Mark3 = false;	//面板3初态-收缩
	m_Title3.SetButStatus(BUT_STATUS_RIGHT);
	ShowBox3( SW_HIDE );	//隐藏面板3中控件

	CRect rect;
	CWnd *pWnd = GetDlgItem( IDC_TITLE1 );
	pWnd->GetWindowRect( &rect );		//求标题条尺寸
	m_TitleHeight = rect.Height();		//标题条高度
	m_BoxHeight[0] = m_TitleHeight+60;			//面板1的高度(包括标题条)
	m_BoxHeight[1] = m_TitleHeight+88;			//面板2的高度(包括标题条)
	m_BoxHeight[2] = m_TitleHeight+40;			//面板3的高度(此值在增加面板时才有用)

	CalculateControlPos1();		//显示面板组
	SetBox1Pos();
	CalculateControlPos2();
	SetBox2Pos();
	CalculateControlPos3();
	SetBox3Pos();
}

//刷新面板组
void CCurtainBoxDlg::InvalidateBox()
{
	CalculateControlPos1();
	SetBox1Pos();
	CalculateControlPos2();
	SetBox2Pos();
	CalculateControlPos3();
	SetBox3Pos();
	InvalidateRect( &m_BoxRext );
}

////////////////////////////////////////////////////////////////////////////
//面板1

//计算各控件位置
void CCurtainBoxDlg::CalculateControlPos1()
{
	m_TitlePt[0].x = m_BoxRext.left;	//标题条位置(左上角坐标)
	m_TitlePt[0].y = m_BoxRext.top;
	m_ControlPt1[0] = CPoint( m_TitlePt[0].x+5, m_TitlePt[0].y+m_TitleHeight+10 );//控件位置(相对于标题条)
	m_ControlPt1[1] = CPoint( m_TitlePt[0].x+31, m_TitlePt[0].y+m_TitleHeight+7 );
	m_ControlPt1[2] = CPoint( m_TitlePt[0].x+7, m_TitlePt[0].y+m_TitleHeight+38 );
	m_ControlPt1[3] = CPoint( m_TitlePt[0].x+75, m_TitlePt[0].y+m_TitleHeight+38 );
}

//设置各控件位置
void CCurtainBoxDlg::SetBox1Pos()
{
	CWnd *pWnd = GetDlgItem( IDC_TITLE1 );
	pWnd->SetWindowPos( NULL, m_TitlePt[0].x, m_TitlePt[0].y,
						0, 0, SWP_NOSIZE | SWP_NOZORDER );		//调整标题栏位置
	int i;
	for( i=0; i<BOX1_NUMBER; i++ )
	{
		pWnd = GetDlgItem( m_Box1ID[i] );
		pWnd->SetWindowPos( NULL, m_ControlPt1[i].x, m_ControlPt1[i].y,
					0, 0, SWP_NOSIZE | SWP_NOZORDER );		//调整控件位置
	}
}

//显示/隐藏面板(SW_SHOW-显示、SW_HIDE-隐藏)
void CCurtainBoxDlg::ShowBox1(int nShow)
{
	CWnd *pWnd;
	for( int i=0; i<BOX1_NUMBER; i++ )
	{
		pWnd = GetDlgItem( m_Box1ID[i] );
		pWnd->ShowWindow( nShow );
	}
}

////////////////////////////////////////////////////////////////////////////
//面板2

//计算各控件位置
void CCurtainBoxDlg::CalculateControlPos2()
{
	m_TitlePt[1].x = m_BoxRext.left;	//标题条位置(左上角坐标)
	if( b_Mark1 )	//面板1是展开的
		m_TitlePt[1].y = m_TitlePt[0].y+m_BoxHeight[0];
	else			//面板1是收起的
		m_TitlePt[1].y = m_TitlePt[0].y+m_TitleHeight;
	m_ControlPt2[0] = CPoint( m_TitlePt[1].x+5, m_TitlePt[1].y+m_TitleHeight+7 );	//控件位置
}

//设置各控件位置
void CCurtainBoxDlg::SetBox2Pos()
{
	CWnd *pWnd = GetDlgItem( IDC_TITLE2 );
	pWnd->SetWindowPos( NULL, m_TitlePt[1].x, m_TitlePt[1].y,
						0, 0, SWP_NOSIZE | SWP_NOZORDER );		//调整标题栏位置
	int i;
	for( i=0; i<BOX2_NUMBER; i++ )
	{
		pWnd = GetDlgItem( m_Box2ID[i] );
		pWnd->SetWindowPos( NULL, m_ControlPt2[i].x, m_ControlPt2[i].y,
					0, 0, SWP_NOSIZE | SWP_NOZORDER );		//调整控件位置
	}
}

//显示/隐藏面板
void CCurtainBoxDlg::ShowBox2(int nShow)
{
	CWnd *pWnd;
	for( int i=0; i<BOX2_NUMBER; i++ )
	{
		pWnd = GetDlgItem( m_Box2ID[i] );
		pWnd->ShowWindow( nShow );
	}
}

////////////////////////////////////////////////////////////////////////////
//面板3

//计算各控件位置
void CCurtainBoxDlg::CalculateControlPos3()
{
	m_TitlePt[2].x = m_BoxRext.left;	//标题条位置(左上角坐标)
	if( b_Mark2 )	//面板2是展开的
		m_TitlePt[2].y = m_TitlePt[1].y+m_BoxHeight[1];
	else			//面板2是收起的
		m_TitlePt[2].y = m_TitlePt[1].y+m_TitleHeight;
	m_ControlPt3[0] = CPoint( m_TitlePt[2].x+5, m_TitlePt[2].y+m_TitleHeight+7 );	//控件位置
	m_ControlPt3[1] = CPoint( m_TitlePt[2].x+85, m_TitlePt[2].y+m_TitleHeight+7 );
	m_ControlPt3[2] = CPoint( m_TitlePt[2].x+5, m_TitlePt[2].y+m_TitleHeight+35 );
}

//设置各控件位置
void CCurtainBoxDlg::SetBox3Pos()
{
	CWnd *pWnd = GetDlgItem( IDC_TITLE3 );
	pWnd->SetWindowPos( NULL, m_TitlePt[2].x, m_TitlePt[2].y,
						0, 0, SWP_NOSIZE | SWP_NOZORDER );		//调整标题栏位置
	int i;
	for( i=0; i<BOX3_NUMBER; i++ )
	{
		pWnd = GetDlgItem( m_Box3ID[i] );
		pWnd->SetWindowPos( NULL, m_ControlPt3[i].x, m_ControlPt3[i].y,
					0, 0, SWP_NOSIZE | SWP_NOZORDER );		//调整控件位置
	}
}

//显示/隐藏面板
void CCurtainBoxDlg::ShowBox3(int nShow)
{
	CWnd *pWnd;
	for( int i=0; i<BOX3_NUMBER; i++ )
	{
		pWnd = GetDlgItem( m_Box3ID[i] );
		pWnd->ShowWindow( nShow );
	}
}

//////////////////////////////////////////////////////////////////////////////////
//单击标题响应函数

//单击面板1标题(由ClassWizard添加)
void CCurtainBoxDlg::OnTitle1() 
{
	if( m_Title1.ClickBut() )	//单击有效区
	{
		b_Mark1 = !b_Mark1;		//修改状态
		if( b_Mark1 && b_Mark2 && b_Mark3 )		//保证最多同时展开两个面板
		{
			b_Mark3 = false;
			m_Title3.SetButStatus(BUT_STATUS_RIGHT);
			ShowBox3( SW_HIDE);
		}
		if( b_Mark1 )		//展开/隐藏面板1
			ShowBox1( SW_SHOW );
		else
			ShowBox1( SW_HIDE );
		InvalidateBox();		//刷新面板组
	}
}

//单击面板2标题(由ClassWizard添加)
void CCurtainBoxDlg::OnTitle2() 
{
	if( m_Title2.ClickBut() )
	{
		b_Mark2 = !b_Mark2;
		if( b_Mark1 && b_Mark2 && b_Mark3 )
		{
			b_Mark3 = false;
			m_Title3.SetButStatus(BUT_STATUS_RIGHT);
			ShowBox3( SW_HIDE);
		}
		if( b_Mark2 )
			ShowBox2( SW_SHOW );
		else
			ShowBox2( SW_HIDE );
		InvalidateBox();		//刷新面板组
	}
}

//单击面板3标题(由ClassWizard添加)
void CCurtainBoxDlg::OnTitle3() 
{
	if( m_Title3.ClickBut() )
	{
		b_Mark3 = !b_Mark3;
		if( b_Mark1 && b_Mark2 && b_Mark3 )
		{
			b_Mark1 = false;
			m_Title1.SetButStatus(BUT_STATUS_RIGHT);
			ShowBox1( SW_HIDE);
		}
		if( b_Mark3 )
			ShowBox3( SW_SHOW );
		else
			ShowBox3( SW_HIDE );
		InvalidateBox();		//刷新面板组
	}
}